home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / cvs / contrib / log < prev    next >
Text File  |  2005-10-16  |  6KB  |  227 lines

  1. #! /usr/bin/perl -T
  2. # -*-Perl-*-
  3.  
  4. ###############################################################################
  5. ###############################################################################
  6. ###############################################################################
  7. #
  8. # THIS SCRIPT IS PROBABLY BROKEN.  REMOVING THE -T SWITCH ON THE #! LINE ABOVE
  9. # WOULD FIX IT, BUT THIS IS INSECURE.  WE RECOMMEND FIXING THE ERRORS WHICH THE
  10. # -T SWITCH WILL CAUSE PERL TO REPORT BEFORE RUNNING THIS SCRIPT FROM A CVS
  11. # SERVER TRIGGER.  PLEASE SEND PATCHES CONTAINING THE CHANGES YOU FIND
  12. # NECESSARY TO RUN THIS SCRIPT WITH THE TAINT-CHECKING ENABLED BACK TO THE
  13. # <bug-cvs@gnu.org> MAILING LIST.
  14. #
  15. # For more on general Perl security and taint-checking, please try running the
  16. # `perldoc perlsec' command.
  17. #
  18. ###############################################################################
  19. ###############################################################################
  20. ###############################################################################
  21.  
  22. # XXX: FIXME: handle multiple '-f logfile' arguments
  23. #
  24. # XXX -- I HATE Perl!  This *will* be re-written in shell/awk/sed soon!
  25. #
  26.  
  27. # Usage:  log.pl [-u user] [[-m mailto] ...] [-s] [-V] -f logfile 'dirname file ...'
  28. #
  29. #    -u user        - $USER passed from loginfo
  30. #    -m mailto    - for each user to receive cvs log reports
  31. #            (multiple -m's permitted)
  32. #    -s        - to prevent "cvs status -v" messages
  33. #    -V        - without '-s', don't pass '-v' to cvs status
  34. #    -f logfile    - for the logfile to append to (mandatory,
  35. #            but only one logfile can be specified).
  36.  
  37. # here is what the output looks like:
  38. #
  39. #    From: woods@kuma.domain.top
  40. #    Subject: CVS update: testmodule
  41. #
  42. #    Date: Wednesday November 23, 1994 @ 14:15
  43. #    Author: woods
  44. #
  45. #    Update of /local/src-CVS/testmodule
  46. #    In directory kuma:/home/kuma/woods/work.d/testmodule
  47. #    
  48. #    Modified Files:
  49. #        test3 
  50. #    Added Files:
  51. #        test6 
  52. #    Removed Files:
  53. #        test4 
  54. #    Log Message:
  55. #    - wow, what a test
  56. #
  57. # (and for each file the "cvs status -v" output is appended unless -s is used)
  58. #
  59. #    ==================================================================
  60. #    File: test3               Status: Up-to-date
  61. #    
  62. #       Working revision:    1.41    Wed Nov 23 14:15:59 1994
  63. #       Repository revision:    1.41    /local/src-CVS/cvs/testmodule/test3,v
  64. #       Sticky Options:    -ko
  65. #    
  66. #       Existing Tags:
  67. #        local-v2                     (revision: 1.7)
  68. #        local-v1                     (revision: 1.1.1.2)
  69. #        CVS-1_4A2                    (revision: 1.1.1.2)
  70. #        local-v0                     (revision: 1.2)
  71. #        CVS-1_4A1                    (revision: 1.1.1.1)
  72. #        CVS                          (branch: 1.1.1)
  73.  
  74. use strict;
  75. use IO::File;
  76.  
  77. my $cvsroot = $ENV{'CVSROOT'};
  78.  
  79. # turn off setgid
  80. #
  81. $) = $(;
  82.  
  83. my $dostatus = 1;
  84. my $verbosestatus = 1;
  85. my $users;
  86. my $login;
  87. my $donefiles;
  88. my $logfile;
  89. my @files;
  90.  
  91. # parse command line arguments
  92. #
  93. while (@ARGV) {
  94.     my $arg = shift @ARGV;
  95.  
  96.     if ($arg eq '-m') {
  97.         $users = "$users " . shift @ARGV;
  98.     } elsif ($arg eq '-u') {
  99.         $login = shift @ARGV;
  100.     } elsif ($arg eq '-f') {
  101.         ($logfile) && die "Too many '-f' args";
  102.         $logfile = shift @ARGV;
  103.     } elsif ($arg eq '-s') {
  104.         $dostatus = 0;
  105.     } elsif ($arg eq '-V') {
  106.         $verbosestatus = 0;
  107.     } else {
  108.         ($donefiles) && die "Too many arguments!\n";
  109.         $donefiles = 1;
  110.         @files = split(/ /, $arg);
  111.     }
  112. }
  113.  
  114. # the first argument is the module location relative to $CVSROOT
  115. #
  116. my $modulepath = shift @files;
  117.  
  118. my $mailcmd = "| Mail -s 'CVS update: $modulepath'";
  119.  
  120. # Initialise some date and time arrays
  121. #
  122. my @mos = ('January','February','March','April','May','June','July',
  123.     'August','September','October','November','December');
  124. my @days = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
  125.  
  126. my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
  127. $year += 1900;
  128.  
  129. # get a login name for the guy doing the commit....
  130. #
  131. if ($login eq '') {
  132.     $login = getlogin || (getpwuid($<))[0] || "nobody";
  133. }
  134.  
  135. # open log file for appending
  136. #
  137. my $logfh = new IO::File ">>" . $logfile
  138.     or die "Could not open(" . $logfile . "): $!\n";
  139.  
  140. # send mail, if there's anyone to send to!
  141. #
  142. my $mailfh;
  143. if ($users) {
  144.     $mailcmd = "$mailcmd $users";
  145.     $mailfh = new IO::File $mailcmd
  146.         or die "Could not Exec($mailcmd): $!\n";
  147. }
  148.  
  149. # print out the log Header
  150. #
  151. $logfh->print ("\n");
  152. $logfh->print ("****************************************\n");
  153. $logfh->print ("Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" . sprintf("%02d", $min) . "\n");
  154. $logfh->print ("Author:\t$login\n\n");
  155.  
  156. if ($mailfh) {
  157.     $mailfh->print ("\n");
  158.     $mailfh->print ("Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" . sprintf("%02d", $min) . "\n");
  159.     $mailfh->print ("Author:\t$login\n\n");
  160. }
  161.  
  162. # print the stuff from logmsg that comes in on stdin to the logfile
  163. #
  164. my $infh = new IO::File "< -";
  165. foreach ($infh->getlines) {
  166.     $logfh->print;
  167.     if ($mailfh) {
  168.         $mailfh->print ($_);
  169.     }
  170. }
  171. undef $infh;
  172.  
  173. $logfh->print ("\n");
  174.  
  175. # after log information, do an 'cvs -Qq status -v' on each file in the arguments.
  176. #
  177. if ($dostatus != 0) {
  178.     while (@files) {
  179.         my $file = shift @files;
  180.         if ($file eq "-") {
  181.             $logfh->print ("[input file was '-']\n");
  182.             if ($mailfh) {
  183.                 $mailfh->print ("[input file was '-']\n");
  184.             }
  185.             last;
  186.         }
  187.         my $rcsfh = new IO::File;
  188.         my $pid = $rcsfh->open ("-|");
  189.         if ( !defined $pid )
  190.         {
  191.             die "fork failed: $!";
  192.         }
  193.         if ($pid == 0)
  194.         {
  195.             my @command = ('cvs', '-nQq', 'status');
  196.             if ($verbosestatus)
  197.             {
  198.                 push @command, '-v';
  199.             }
  200.             push @command, $file;
  201.             exec @command;
  202.             die "cvs exec failed: $!";
  203.         }
  204.         my $line;
  205.         while ($line = $rcsfh->getline) {
  206.             $logfh->print ($line);
  207.             if ($mailfh) {
  208.                 $mailfh->print ($line);
  209.             }
  210.         }
  211.         undef $rcsfh;
  212.     }
  213. }
  214.  
  215. $logfh->close()
  216.     or die "Write to $logfile failed: $!";
  217.  
  218. if ($mailfh)
  219. {
  220.     $mailfh->close;
  221.     die "Pipe to $mailcmd failed" if $?;
  222. }
  223.  
  224. ## must exit cleanly
  225. ##
  226. exit 0;
  227.